<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 点击按钮弹出警告'你别点我' -->
     <input type="button" value="click" onclick="(function(userName){alert(userName+'你别点我');})('张三')"/>
    
</body>
<script>
//函数表达式：把函数定义直接赋值给一个变量
    let f1 =function add(){
        console.log("hello world");
    };
//调用：变量名();
f1();
//带参数的函数表达式
    let f2  = function add(a,b){
        console.log(a+b);
};
    f2(1,2);//3
    console.log(f2(5,6));//未定义

//有返回值的函数表达式
    let f3 =function add(a,b){
        return a+b;
    };
     //let res=f3(3,4);
    //  console.log(res);
     console.log(f3(3,4));//7
//匿名函数：没有函数名字
   let myf1 =function(){
    console.log('hello myf1');
   };
   myf1();
   let myf2 = function(a,b){
    return a<b?a:b;//三元运算符：真的输出a，反之输出b
   };
   console.log(myf2(-8,0));
//函数表达式注意问题：一定要先声明函数，然后正再调用函数。

//立即执行函数：把函数的声明看作一个整体，声明结束立即调用。匿名自调用函数
    (function(){
        console.log('hello world');
    })();
    (function(a,b){
        console.log(a-b);
    })(10,6);
    console.log('----------')
    console.log(function(){
        return 0;
    }());
    
    let a = function(){
        console.log('hello');

    };
    console.log(typeof a);//function,数组：object
    console.log('-----------');
    //把函数作为参数传给另一个函数
    //把函数a作为参数传递给函数b，并在函数b中调用函数a,把a称作回调函数。
    let arg1 =function(){
        return 0;
    };
    console.log(arg1);

    let fun =function(a,b){
        console.log(b*a());
    }
    fun(arg1,8888);
    //递归函数：把函数作为参数传给函数本身。调用函数本身。
    //注意:递归函数容易造成死循环。
    //阶乘：10！=10*9*8*...*1 > 10*9! > 10*9*(8!) >...
   /* let arg2 =function(a){
        return 0;
    }
    let arg3 = function(fn){
        return fn();
    }
    arg3(arg3);*/
    let jc = function(n){
        if(n === 1){
            return 1;
        }else{
            return n*jc(n-1);
        }
    }
    console.log(jc(10));
</script>
</html>